package com.oop.ch09;

import com.oop.ch06.Cat;

import java.util.ArrayList;
import java.util.List;

public class ArrayListTest {
	
	public static void main(String[] args) {
		arrayList1();
	}
	
	/**
	 * 使用List接口---ArrayList来存放数据
	 * list：存储一组不唯一，有顺序的集合
	 */
	public static void arrayList1() {
		int num1[]={0,1,2,3,4};//声明一个数组，并赋值
		int num2[]=new int[5];//声明一个固定长度的数组（5）
		num2[0]=0;
		num2[1]=1;
		
		System.out.println(num2[0]);
		//************************************************
		//List是一个接口，接口不能new，需要new 实现类
		//List存放数据最好是相同类型
		List list1=new ArrayList();
		//add方法来存储数据
		list1.add(10);
		list1.add(123);
		list1.add(24);
		list1.add("张三");
		
		//get方法获取数据---索引
		System.out.println(list1.get(1));
		System.out.println(list1.get(3));
		
		//删除1---按照存储对象的内容删除，要求你存储的是什么对象，删除的时候也删除什么对象
		list1.remove("张三");
		//删除2---按照集合中的索引删除---推荐使用，
		list1.remove(2);
		
		//修改操作---先删除索引位置的数据，然后在对应的索引位置添加数据
		list1.remove(1);
		list1.add(1, 11);
		
		//给集合的首位添加数据
		list1.add(0, 0);
		//给集合的末尾添加数据
		list1.add(20);
		
		
		list1.add("张三");
		list1.add(new Cat("波斯猫", "翠花", "雌性", 1, 3, 5.5));
		
		//获取list集合的长度
		System.out.println("list集合的长度:"+list1.size());
		
		//遍历1---使用于Object对象，即，集合当中有可能存储的数据类型不同
		for(int i=0;i<list1.size();i++){
			System.out.println("list1的第"+(i+1)+"元素为："+list1.get(i));
		}
		
		//打印list中的数据
		System.out.println(list1);
		
		
		//遍历2---使用于集合当中存储的数据类型相同
		List list2=new ArrayList();
		list2.add(0);
		list2.add(1);
		list2.add(2);
		list2.add(3);
		list2.add(4);
		list2.add("张三");
		
		for (Object object : list2) {
			System.out.println("循环："+object);
		}
		
		//遍历3(范型)---使用于集合当中存储的数据类型相同
		//int基本的数据类型-整数型 默认值为0 --- Interger---对象类型---整数型 默认值都是null
		//double 浮点型 默认0.0 ----Double---对象类型---浮点型型 默认值都是null
		//long 长整型 默认值0 ----Long---对象类型---长整型 默认值都是null
		//boolean 布尔类型 默认值true----Boolean---对象类型---布尔类型 默认值都是null
		//String 默认值是null
		List<Integer> list3=new ArrayList();
		list3.add(0);
		list3.add(1);
		list3.add(2);
		list3.add(3);
		list3.add(4);
		
		for(int num:list3){
			System.out.println("范型3循环："+num);
		}
		
		
		List cats1=new ArrayList();//cats1集合中存储的是object类型,
		cats1.add(new Cat("波斯猫", "翠花1", "雌性", 1, 3, 5.5));
		cats1.add(new Cat("波斯猫", "翠花2", "雌性", 1, 3, 5.5));
		cats1.add(new Cat("波斯猫", "翠花3", "雌性", 1, 3, 5.5));
		cats1.add(new Cat("波斯猫", "翠花4", "雌性", 1, 3, 5.5));
		cats1.add(new Cat("波斯猫", "翠花5", "雌性", 1, 3, 5.5));
		for (int i=0;i<cats1.size();i++){
			Cat cat=(Cat) cats1.get(i);//从集合中获取对应索引位置的数据，需要把Object对象转换成具体的对象cat
			System.out.println("强制类型转换："+cat);
		}
		
		//遍历4(范型)---使用于集合当中存储的数据类型相同
		List<Cat> cats=new ArrayList();
		cats.add(new Cat("波斯猫", "翠花1", "雌性", 1, 3, 5.5));
		cats.add(new Cat("波斯猫", "翠花2", "雌性", 1, 3, 5.5));
		cats.add(new Cat("波斯猫", "翠花3", "雌性", 1, 3, 5.5));
		cats.add(new Cat("波斯猫", "翠花4", "雌性", 1, 3, 5.5));
		cats.add(new Cat("波斯猫", "翠花5", "雌性", 1, 3, 5.5));
		
		for(Cat cat:cats){
			System.out.println(cat);
		}
		
		//从list4中查看是否存储了值为2的元素
		List<Integer> list4=new ArrayList<>();
		list4.add(1);
		list4.add(2);
		list4.add(10);
		list4.add(20);
		
		boolean result=false;//没有找到
		for (int num:list4){
			if(num==2){
				result=true;//找到为2的元素
				//return;
				break;
			}
		}
		System.out.println(result ? "找到2" : "没有找到2");
		
		//list4.contains(2)==true 可以简写为list4.contains(2)
		if(list4.contains(2)){
			System.out.println("找到2");
		}else {
			System.out.println("没有找到2");
		}
		
		//contains(要查找的元素) 返回true/false
		System.out.println(list4.contains(2) ? "找到2" : "没有找到2");
		
		List<Cat> cats2=new ArrayList();
		//cat3 01010101
		Cat cat3=new Cat("波斯猫", "翠花3", "雌性", 1, 3, 5.5);
		Cat cat4=new Cat("波斯猫", "翠花3", "雌性", 1, 3, 5.5);
		
		cats2.add(new Cat("波斯猫", "翠花1", "雌性", 1, 3, 5.5));
		cats2.add(new Cat("波斯猫", "翠花2", "雌性", 1, 3, 5.5));
		cats2.add(cat3);
		cats2.add(new Cat("波斯猫", "翠花4", "雌性", 1, 3, 5.5));
		cats2.add(new Cat("波斯猫", "翠花5", "雌性", 1, 3, 5.5));
		
		System.out.println(cats2.contains(cat3) ? "找到翠花3" : "没有找到翠花3");
		System.out.println(cats2.contains(cat4) ? "找到翠花3" : "没有找到翠花3");
	}
}
